package com.qiangshi.system.mybatis.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TableNameHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.DynamicTableNameInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.qiangshi.common.utils.StringUtils;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Objects;

/**
 * Mybatis-plus 配置类
 *
 * @author Nottyjay
 * @since 2020-10-10
 */
@Configuration
@MapperScan("com.qiangshi.*.mapper")
public class MybatisConfig {


    public static ThreadLocal<String> TABLE_NAME = new ThreadLocal<String>();

    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        DynamicTableNameInnerInterceptor dynamicTableNameInnerInterceptor = null;
        TableNameHandler tableNameHandler = null;
        interceptor.addInnerInterceptor(paginationInnerInterceptor);
        dynamicTableNameInnerInterceptor = new DynamicTableNameInnerInterceptor();
        tableNameHandler = new TableNameHandler() {
            @Override
            public String dynamicTableName(String sql, String tableName) {
                if (StringUtils.isNotEmpty(TABLE_NAME.get())) {
                    return TABLE_NAME.get();
                } else {
                    return tableName;
                }
            }
        };
        dynamicTableNameInnerInterceptor.setTableNameHandler(tableNameHandler);
        interceptor.addInnerInterceptor(dynamicTableNameInnerInterceptor);
        return interceptor;
    }


}
